/**
 ******************************************************************************
 * @file           : bsp_w25qxx.h
 * @brief          : W25Qxx SPI Flash Driver Header File (STM32H7xx)
 ******************************************************************************
 * @attention
 *
 * W25Qxx系列SPI Flash驱动程序头文件
 * 支持W25Q80/16/32/64/128系列芯片
 *
 ******************************************************************************
 */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __BSP_W25QXX_H
#define __BSP_W25QXX_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
#include <stdbool.h>

/* Exported types ------------------------------------------------------------*/

/**
 * @brief W25Qxx错误码枚举
 */
typedef enum
{
    W25QXX_OK = 0,                  /*!< 操作成功 */
    W25QXX_ERROR = -1,              /*!< 操作失败 */
    W25QXX_ERROR_PARAM = -2,        /*!< 参数错误 */
    W25QXX_ERROR_BUSY = -3,         /*!< 芯片忙 */
    W25QXX_ERROR_TIMEOUT = -4,      /*!< 超时 */
} W25QXX_Error_e;

/**
 * @brief W25Qxx芯片信息结构体
 */
typedef struct
{
    uint16_t manufacturer_id;       /*!< 厂商ID (0xEF) */
    uint16_t device_id;             /*!< 设备ID */
    uint32_t capacity;              /*!< 容量（字节） */
    uint16_t page_size;             /*!< 页大小（字节） */
    uint16_t sector_size;           /*!< 扇区大小（字节） */
    uint16_t block_size;            /*!< 块大小（字节） */
} W25QXX_Info_t;

/* Exported constants --------------------------------------------------------*/

/* W25Qxx指令集 */
#define W25QXX_CMD_WRITE_ENABLE         0x06
#define W25QXX_CMD_WRITE_DISABLE        0x04
#define W25QXX_CMD_READ_STATUS_REG1     0x05
#define W25QXX_CMD_READ_STATUS_REG2     0x35
#define W25QXX_CMD_WRITE_STATUS_REG     0x01
#define W25QXX_CMD_PAGE_PROGRAM         0x02
#define W25QXX_CMD_QUAD_PAGE_PROGRAM    0x32
#define W25QXX_CMD_SECTOR_ERASE         0x20
#define W25QXX_CMD_BLOCK_ERASE_32K      0x52
#define W25QXX_CMD_BLOCK_ERASE_64K      0xD8
#define W25QXX_CMD_CHIP_ERASE           0xC7
#define W25QXX_CMD_READ_DATA            0x03
#define W25QXX_CMD_FAST_READ            0x0B
#define W25QXX_CMD_POWER_DOWN           0xB9
#define W25QXX_CMD_RELEASE_POWER_DOWN   0xAB
#define W25QXX_CMD_DEVICE_ID            0xAB
#define W25QXX_CMD_MANUFACTURER_ID      0x90
#define W25QXX_CMD_JEDEC_ID             0x9F

/* Exported macro ------------------------------------------------------------*/
/* Exported variables --------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/

/* 初始化和信息读取 */
void w25qxx_init(void);
W25QXX_Error_e w25qxx_read_id(uint16_t *manufacturer_id, uint16_t *device_id);
W25QXX_Error_e w25qxx_get_info(W25QXX_Info_t *info);

/* 读写操作 */
W25QXX_Error_e w25qxx_read(uint32_t addr, uint8_t *buf, uint32_t len);
W25QXX_Error_e w25qxx_write(uint32_t addr, const uint8_t *buf, uint32_t len);

/* 擦除操作 */
W25QXX_Error_e w25qxx_erase_sector(uint32_t sector_addr);
W25QXX_Error_e w25qxx_erase_block(uint32_t block_addr);
W25QXX_Error_e w25qxx_erase_chip(void);

/* 状态和电源管理 */
bool w25qxx_is_busy(void);
void w25qxx_power_down(void);
void w25qxx_wake_up(void);

#ifdef __cplusplus
}
#endif

#endif /* __BSP_W25QXX_H */
